<?php
/**
 * Este controlador se encarga de todas las acciones que tienen que ver con el ABM de Usuarios.
 * 
 * @package Users
 * @author j.m.j.s. (02/08/2009)
 */
class UserController extends CController
{
	/**
	 * @var const Indica el numero de registros por defecto en un listado.
	 */
	const PAGE_SIZE=25;

	/**
	 * @var string Indica cual es el layout que se debe usar por defecto.
	 */
	public $layout = 'application.views.layouts.administrator';

	/**
	 * @var string specifies the default action to be 'list'.
	 */
	public $defaultAction='admin';

	/**
	 * @var CActiveRecord the currently loaded data model instance.
	 */
	private $_model;

	/**
	 * @return array action filters
	 */
	public function filters()
	{
		return array(
			'accessControl', // perform access control for CRUD operations
		);
	}

	/**
	 * Specifies the access control rules.
	 * This method is used by the 'accessControl' filter.
	 * 
	 * @return array access control rules
 	 * @author j.m.j.s. (02/08/2009)
	 */
	public function accessRules()
	{
		return array(
			array('allow', // Permite el ingreso a todo usuario logado que tenga el perfil de administrador.
				'actions'=>array('create','update','show','admin','delete','status'),
				'expression'=>'Yii::app()->user->getState("usr_profile")==User::ROLE_ADMIN',
				'expression'=>'Yii::app()->user->getState("usr_profile")==User::ROLE_EDITOR',
			),
			array('deny',  // deny all users
				'users'=>array('*'),
			),
		);
	}

	/**
	 * Creates a new model.
	 * If creation is successful, the browser will be redirected to the 'show' page.
	 * 
 	 * @author j.m.j.s. (02/08/2009)
 	 * @author j.m.j.s. (21/01/2010)
	 */
	public function actionCreate()
	{
		$model=new User;
		$model->scenario='create';
		
		if(isset($_POST['User']))
		{
			$model->attributes=$_POST['User'];
			$model->usr_profile = $_POST['profile'];
			$model->usr_status = 1;

			$rijndael = new RijndaelHex(Yii::app()->params['rijndaelKey']);
			$model->usr_password = $rijndael->linencrypthexComplex($model->usr_password,$model->usr_nickname);
			
			if($model->save())
				$this->redirect(array('admin'));
			else
			{
				$model->usr_password = $_POST['User']['usr_password'];
				
				if($_POST['User']['usr_password']=='')
					$model->addError('usr_password','Contraseña no puede ser nulo.');
			}
		}
		$this->render('create',array('model'=>$model));
	}

	/**
	 * Updates a particular model.
	 * If update is successful, the browser will be redirected to the 'admin' page.
	 * 
 	 * @author j.m.j.s. (02/08/2009)
 	 * @author j.m.j.s. (21/01/2010)
	 */
	public function actionUpdate()
	{
		$model=$this->loadUser();
		$model->scenario='update';
		
		if(isset($_POST['User']))
		{
			$oldCryptPass = $model->usr_password;
			$oldNick = $model->usr_nickname;
			$model->attributes = $_POST['User'];
			$model->usr_profile = $_POST['profile'];

			$rijndael = new RijndaelHex(Yii::app()->params['rijndaelKey']);
			
			//Si el usuario ingresó un nuevo password...
			if($model->usr_password!='')
			{
				$model->usr_password = $rijndael->linencrypthexComplex($model->usr_password,$model->usr_nickname);
			}
			else
			{
				//Si el no se modificó el password entonces se deja el viejo password
				$model->usr_password = $oldCryptPass;
				
				//...pero si se modifica el nickname toca sobre-escribir el password
				if($oldNick != $model->usr_nickname)
				{
					//Se desencripta el password
					$passDecryp = $rijndael->lindecrypthexComplex($model->usr_password);
					//Se encripta nuevamente el password pero con el nuevo nickname
					$model->usr_password = $rijndael->linencrypthexComplex($passDecryp,$model->usr_nickname);
				}
			}
			
			if($model->save())
				$this->redirect(array('admin'));
			else
				$model->usr_password = '';
		}
		else
	        $model->usr_password = '';
		
		$this->render('update',array('model'=>$model));
	}

	/**
	 * Deletes a particular model.
	 * If deletion is successful, the browser will be redirected to the 'list' page.
	 * 
 	 * @author j.m.j.s. (02/08/2009)
	 */
	public function actionDelete()
	{
		if(Yii::app()->request->isPostRequest)
		{
			// we only allow deletion via POST request
			$this->loadUser()->delete();
			$this->redirect(array('list'));
		}
		else
			throw new CHttpException(400,'Invalid request. Please do not repeat this request again.');
	}

	/**
	 * Manages all models.
	 * 
 	 * @author j.m.j.s. (02/08/2009)
	 */
	public function actionAdmin()
	{
		$this->processAdminCommand();

		$criteria=new CDbCriteria;
		//Si el usuario hizo click en Buscar
		if(isset($_GET['searchText']))
		{
			$criteria->condition = "(usr_nickname LIKE '%{$_GET['searchText']}%' OR usr_name LIKE '%{$_GET['searchText']}%') ";
			
			$searchText = $_GET['searchText'];
		}
		else
			$searchText = '';
		
		if(Yii::app()->user->getState("usr_profile") != User::ROLE_ADMIN){
    
      	$criteria->compare('usr_code',Yii::app()->user->id,true);
    }
		
		$pages=new CPagination(User::model()->count($criteria));
		
		if(isset($_GET['size']) and is_numeric($_GET['size']))
			$pages->pageSize = $_GET['size'];
		else 
			$pages->pageSize = self::PAGE_SIZE;

		$pages->applyLimit($criteria);

		$sort=new CSort('User');
		$sort->applyOrder($criteria);

		$models=User::model()->findAll($criteria);

		$this->render('admin',array(
			'models'=>$models,
			'pages'=>$pages,
			'sort'=>$sort,
			'searchText'=>$searchText,
		));
	}

	/**
	 * Retorna los datos del modelo segun la llave primaria pasada por Get o por el parametro de la función.
	 * Si los datos del modelo no son encontrados entonces redirige a una pagina de error.
     * 
     * @param integer $id Es el código del registro que se va a cargar.
     * @return model
     * @author j.m.j.s. (02/08/2009)
     */
	public function loadUser($id=null)
	{
		if($id!==null || isset($_GET['id']))
			$this->_model=User::model()->findbyPk($id!==null ? $id : $_GET['id']);
		if($this->_model===null)
			throw new CHttpException(404,'The requested page does not exist.');

		return $this->_model;
	}

	/**
	 * Executes any command triggered on the admin page.
	 * 
 	 * @author j.m.j.s. (02/08/2009)
	 */
	protected function processAdminCommand()
	{
		if(isset($_POST['command'], $_POST['id']) && $_POST['command']==='delete')
		{
			$this->loadUser($_POST['id'])->delete();
			// reload the current page to avoid duplicated delete actions
			$this->refresh();
		}
	}

	/**
	 * Esta acción es ejecutada cuando hacemos clic sobre la estrellita 
	 * que aparece frente a cada usuario en el listado. 
	 * (el llamado se hace mediante ajax)
	 * - $_POST['user'] : Es el codigo del usuario a activar o desactivar.
	 * 
 	 * @author j.m.j.s. (28/08/2009)
	 */
	public function actionStatus()
	{
		if(isset($_POST['user']) and is_numeric($_POST['user']))
		{
			//Se obtiene la noticia que se desea destacar
			$model = User::model()->findbyPk($_POST['user']);
			
			//Si el usuario es activo, entonces el estado se cambia a 'cero', sino se cambia a 'uno'
			if($model->usr_status == 1)
			{
				$model->usr_status = 0;//Usuario desactivado
				$imagen = 'destacar2.gif';
			}
			else
			{
				$model->usr_status = 1;//Usuario activado
				$model->usr_date_block = '0000-00-00 00:00:00';
				$imagen = 'destacar.gif';
			}
			//Se actualiza la noticia con el nuevo estado 
			$model->update(array('usr_status'));
			
			//Se retorna a la función ajax la imagen de la estrellita que se quiere mostrar.
			echo '<img src="/images/'.$imagen.'" alt="Destacar"/>';
		}
	}
}
